package lv.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameFrame extends JFrame implements KeyListener, ActionListener {
    //创建选项下的对象
    JMenu picterItem=new JMenu("更换图片");
    JMenuItem replayItem=new JMenuItem("重新游戏");
    JMenuItem LoginItem=new JMenuItem("重新登录");
    JMenuItem closeItem=new JMenuItem("关闭游戏");

    JMenuItem accountItem=new JMenuItem("公众号");

    JMenuItem GirlItem=new JMenuItem("美女");
    JMenuItem AnimalItem=new JMenuItem("动物");
    JMenuItem PlayItem=new JMenuItem("运动");
    //创建一个二维数组
    int[][] date=new int[4][4];
    //创建一个临时二维数组
    int[][] Temp=new int[4][4];
    int index=1;
    //统计步数
    int count=0;
    //记录空白图片位置
    int x=0;
    int y=0;
    //定义一个变量记录图片路径
    String path="image/girl/girl";
    //定义一个二维数组，储存正确的位置
    int[][] right={
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,0}
    };
    public GameFrame() {
        //初始化界面
        initJFrame();
        //初始化菜单
        initJmenuBar();
        //初始化数据
        initData();
        //初始化图片
        initImage(date);
        //显示界面
        this.setVisible(true);
    }

    private void initData() {
        int[] tempArr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        Random r=new Random();
        for (int i=0;i<tempArr.length;i++){
            //获取随机索引
            int insex=r.nextInt(tempArr.length);
            //拿着遍历到每一个数据，
            int temp=tempArr[i];
            tempArr[i]=tempArr[insex];
            tempArr[insex]=temp;
        }
        for (int i=0;i<tempArr.length;i++){
            if(tempArr[i]==0){
                x = i/4;
                y = i % 4;
            }
                date[i / 4][i % 4]=tempArr[i];
                Temp[i / 4][i % 4]=tempArr[i];
        }
    }

    private  void initImage(int[][] date) {
        //删除已经加载的所有图片
        this.getContentPane().removeAll();
        if(victory()){
            JLabel Victory=new JLabel(new ImageIcon("image/win.png"));
            Victory.setBounds(203,283,197,73);
            this.getContentPane().add(Victory);
        }
        JLabel stepCount=new JLabel("步数:"+count);
        stepCount.setBounds(50,30,100,20);
        this.getContentPane().add(stepCount);
        for (int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                //创建一个图片对象
                ImageIcon imageicon=new ImageIcon(""+path+""+index+"/"+ date[i][j]+".jpg");
                //创建一个JLabel的对象
                JLabel jlabel=new JLabel(imageicon);
                //指定图片位置
                jlabel.setBounds(105*j+83,105*i+134,105,105);
                //给图片添加边框
                jlabel.setBorder(new BevelBorder(1));
                this.getContentPane().add(jlabel);
            }
        }
        //添加背景图片
        ImageIcon bg=new ImageIcon("image/background.png");
        JLabel background=new JLabel(bg);
        background.setBounds(40,40,508,560);
        this.getContentPane().add(background);
        //刷新图片
        this.getContentPane().repaint();
    }

    private void initJmenuBar() {

        //创建整个菜单对象
        JMenuBar jmenubar=new JMenuBar();
        //创建菜单上的选项
        JMenu functionmenu=new JMenu("功能");
        JMenu aboutmenu=new JMenu("关于我们");

        //将选项下的对象添加到选项上
        functionmenu.add(picterItem);
        functionmenu.add(replayItem);
        functionmenu.add(LoginItem);
        functionmenu.add(closeItem);
        aboutmenu.add(accountItem);
        //添加二级选项
        picterItem.add(GirlItem);
        picterItem.add(AnimalItem);
        picterItem.add(PlayItem);
        //将选项添加到菜单对象是
        jmenubar.add(functionmenu);
        jmenubar.add(aboutmenu);
        //给选项绑定事件
        replayItem.addActionListener(this);
        picterItem.addActionListener(this);
        LoginItem.addActionListener(this);
        closeItem.addActionListener(this);
        accountItem.addActionListener(this);

        GirlItem.addActionListener(this);
        AnimalItem.addActionListener(this);
        PlayItem.addActionListener(this);

        //显示菜单
        this.setJMenuBar(jmenubar);

    }

    private void initJFrame() {
        //设置界面的宽高
        this.setSize(603, 680);
        //设置标题
        this.setTitle("拼图小游戏");
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(3);
        //取消默认的居中放置
        this.setLayout(null);
        //添加键盘监听事件
        this.addKeyListener(this);
    }
    private void CompletePicture() {
        //移除所有图片
        this.getContentPane().removeAll();
        //加载一张完整图片
        ImageIcon all=new ImageIcon(""+path+""+index+"/all.jpg");
        JLabel jlabel=new JLabel(all);
        jlabel.setBounds(83,134,420,420);
        this.getContentPane().add(jlabel);
        //加载背景图片
        ImageIcon bg=new ImageIcon("image/background.png");
        JLabel backgrund=new JLabel(bg);
        backgrund.setBounds(40,40,508,560);
        this.getContentPane().add(backgrund);
        //刷新图片
        this.getContentPane().repaint();
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
    //按下不松时触发
    @Override
    public void keyPressed(KeyEvent e) {
        //按下快捷键A查看完整图片
        int code=e.getKeyCode();
        if(code==65){
            CompletePicture();
        }
    }


    @Override
    public void keyReleased(KeyEvent e) {
        //判断胜利
        if(victory()){
            //结束游戏
            return;
        }
        //对上，下，左，右进行判断
        //左：37 上：38 右：39 下：40
        int code=e.getKeyCode();
        if(code==37){
            //向左移动
            int temp=0;
            if(y==3) return;
            temp=date[x][y];
            date[x][y]=date[x][y+1];
            date[x][y+1]=temp;
            y++;
            count++;
            initImage(date);
        }
        else if(code==38){
            //向上移动
            if(x==3) return;
            int temp=0;
            temp=date[x][y];
            date[x][y]=date[x+1][y];
            date[x+1][y]=temp;
            x++;
            count++;
            initImage(date);
        }
        else if(code==39){
            //向右移动
            if(y==0) return;
            int temp=0;
            temp=date[x][y];
            date[x][y]=date[x][y-1];
            date[x][y-1]=temp;
            y--;
            count++;
            initImage(date);

        }
        else if(code==40){
            //向下移动
            if(x==0) return;
            int temp=0;
            temp=date[x][y];
            date[x][y]=date[x-1][y];
            date[x-1][y]=temp;
            x--;
            count++;
            initImage(date);
        }
        else if(code==65){
            initImage(date);
        }
        else if (code==87){
            date=new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
            x=3;
            y=3;
            initImage(date);
        }
    }
    public boolean victory(){
        //有一个不正确返回false,
        for(int i=0;i<date.length;i++){
            for (int j=0;j<date[i].length;j++){
                if(date[i][j]!=right[i][j]){
                    return false;
                }
            }
        }
        return true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object obj = e.getSource();
        //重新游戏
        if(obj==replayItem){
            count=0;
            initImage(Temp);
        }
        //更换美女图片
        else if(obj==GirlItem){
            count=0;
            path="image/girl/girl";
            Random r1=new Random();
            index=r1.nextInt(13)+1;
            if(index==12){
                index++;
            }
            initData();
            initImage(date);
        }
        //更换动物图片
        else if(obj==AnimalItem){
            count=0;
            path="image/animal/animal";
            Random r1=new Random();
            index=r1.nextInt(8)+1;
            initData();
            initImage(date);
        }
        //更换动物图片
        else if(obj==PlayItem){
            count=0;
            path="image/sport/sport";
            Random r1=new Random();
            index=r1.nextInt(10+1);
            initData();
            initImage(date);
        }
        //关闭游戏
       else if(obj==closeItem)
        {
            System.exit(0);
        }
       //关于我们
       else if (obj==accountItem)
        {
            //创建一个弹窗
            JDialog jdialog=new JDialog();
            //创建一个图片的容器对象Jlabel
            JLabel jlabel=new JLabel(new ImageIcon("image/about.png"));
            //设置位置和宽高
           jlabel.setBounds(0,0,258,258);
           //把图片添加到弹框中
           jdialog.getContentPane().add(jlabel);
           //设置弹框的大小
           jdialog.setSize(344,344);
           //设置弹框置顶
           jdialog.setAlwaysOnTop(true);
           //让弹框居中
           jdialog.setLocationRelativeTo(null);
           //弹框不关闭无法进行其他操作
           jdialog.setModal(true);
           //让弹框显示出来
            jdialog.setVisible(true);
        }
       //重新登录
       else if(obj==LoginItem)
        {
            //关闭当前页面
            this.setVisible(false);
            //启动登录界面
            new LoginFrame();
        }
    }
}
